/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gob.cgr.sgrh.ejb.entidad;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.validator.constraints.Email;

/**
 *
 * @author MICROSOF
 */
@Entity
@Table(name = "persona")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p"),
    @NamedQuery(name = "Persona.findByIdPersona", query = "SELECT p FROM Persona p WHERE p.idPersona = :idPersona"),
    @NamedQuery(name = "Persona.findByNombres", query = "SELECT p FROM Persona p WHERE p.nombres = :nombres"),
    @NamedQuery(name = "Persona.findByApellidoPaterno", query = "SELECT p FROM Persona p WHERE p.apellidoPaterno = :apellidoPaterno"),
    @NamedQuery(name = "Persona.findByApellidoMaterno", query = "SELECT p FROM Persona p WHERE p.apellidoMaterno = :apellidoMaterno"),
    @NamedQuery(name = "Persona.findByFechaNacimiento", query = "SELECT p FROM Persona p WHERE p.fechaNacimiento = :fechaNacimiento"),
    @NamedQuery(name = "Persona.findBySexo", query = "SELECT p FROM Persona p WHERE p.sexo = :sexo"),
    @NamedQuery(name = "Persona.findByNroDocumento", query = "SELECT p FROM Persona p WHERE p.nroDocumento = :nroDocumento"),
    @NamedQuery(name = "Persona.findByNroBrevete", query = "SELECT p FROM Persona p WHERE p.nroBrevete = :nroBrevete"),
    @NamedQuery(name = "Persona.findByEssalud", query = "SELECT p FROM Persona p WHERE p.essalud = :essalud"),
    @NamedQuery(name = "Persona.findByPasaporte", query = "SELECT p FROM Persona p WHERE p.pasaporte = :pasaporte"),
    @NamedQuery(name = "Persona.findByRuc", query = "SELECT p FROM Persona p WHERE p.ruc = :ruc"),
    @NamedQuery(name = "Persona.findByEstadoCivil", query = "SELECT p FROM Persona p WHERE p.estadoCivil = :estadoCivil"),
    @NamedQuery(name = "Persona.findByTipoSangre", query = "SELECT p FROM Persona p WHERE p.tipoSangre = :tipoSangre")
})
public class Persona implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PERSONA")
    private Integer idPersona;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45,message="Debe ingresar el nombre")
    @Column(name = "NOMBRES")
    private String nombres;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45, message="Debe ingresar el apellido paterno")
    @Column(name = "APELLIDO_PATERNO")
    private String apellidoPaterno;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45,message="Debe ingresar el apellido materno")
    @Column(name = "APELLIDO_MATERNO")
    private String apellidoMaterno;
    @Column(name = "FECHA_NACIMIENTO")
    @Temporal(TemporalType.DATE)
    private Date fechaNacimiento;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 1,message="Debe indicar el sexo")
    @Column(name = "SEXO")
    private String sexo;
    @Size(max = 8 , message="El numero de documento debe ser de 8 digitos")
    @Pattern(regexp = "$|[\\s]*[0-9]{8}",message="El numero de documento debe ser de 8 digitos")
    @Column(name = "NRO_DOCUMENTO")
    private String nroDocumento;
    @Size(max = 10)
    @Column(name = "NRO_BREVETE")
    private String nroBrevete;
    @Size(max = 20)
    @Column(name = "ESSALUD")
    private String essalud;
    @Size(max = 20)
    @Column(name = "PASAPORTE")
    private String pasaporte;
    @Size(max = 11, message="El numero de RUC debe ser de 11 digitos")
     @Column(name = "RUC")
    private String ruc;
    @Size(max = 10)
    @Column(name = "ESTADO_CIVIL")
    private String estadoCivil;
    @Size(max = 5)
    @Column(name = "TIPO_SANGRE")
    private String tipoSangre;
    @Email(message="El email ingresado no es valido")
    @Column
    private String email;
    
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<Direccion> direccionList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<DatoFamiliar> datoFamiliarList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<Usuario> usuarioList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<EstudioBasico> estudioBasicoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<Personal> personalList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<FormacionLaboral> formacionLaboralList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "persona")
    private List<Referencia> referenciaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<EstudioProfesional> estudioProfesionalList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<Docencia> docenciaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idPersona")
    private List<Postulante> postulanteList;
    @JoinColumn(name = "LUGAR_NACIMIENTO", referencedColumnName = "ID_AMBITO")
    @ManyToOne(optional = false)
    private Ambito lugarNacimiento;
    @Transient
    private String nombreCompleto;
    @Transient
    private Integer edad;
    
    @Transient
    private boolean personal;
    
    
    public Persona() {
    }

    public Persona(Integer idPersona) {
        this.idPersona = idPersona;
    }

    public Persona(Integer idPersona, String nombres, String apellidoPaterno, String apellidoMaterno, String sexo) {
        this.idPersona = idPersona;
        this.nombres = nombres;
        this.apellidoPaterno = apellidoPaterno;
        this.apellidoMaterno = apellidoMaterno;
        this.sexo = sexo;
    }

    public Integer getIdPersona() {
        return idPersona;
    }

    public void setIdPersona(Integer idPersona) {
        this.idPersona = idPersona;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres.toUpperCase();
    }

    public String getApellidoPaterno() {
        return apellidoPaterno;
    }

    public void setApellidoPaterno(String apellidoPaterno) {
        this.apellidoPaterno = apellidoPaterno.toUpperCase();
    }

    public String getApellidoMaterno() {
        return apellidoMaterno;
    }

    public void setApellidoMaterno(String apellidoMaterno) {
        this.apellidoMaterno = apellidoMaterno.toUpperCase();
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
    	if(fechaNacimiento!=null)
    	if(fechaNacimiento.after(new Date())){
    		throw new javax.validation.ValidationException("La fecha de Nacimiento no debe ser mayor a la de hoy");
    		
    	}
    	
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getNroDocumento() {
        return nroDocumento;
    }

    public void setNroDocumento(String nroDocumento) {
        this.nroDocumento = nroDocumento;
    }

    public String getNroBrevete() {
        return nroBrevete;
    }

    public void setNroBrevete(String nroBrevete) {
        this.nroBrevete = nroBrevete;
    }

    public String getEssalud() {
        return essalud;
    }

    public void setEssalud(String essalud) {
        this.essalud = essalud;
    }

    public String getPasaporte() {
        return pasaporte;
    }

    public void setPasaporte(String pasaporte) {
        this.pasaporte = pasaporte;
    }

    public String getRuc() {
        return ruc;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    public String getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(String estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public String getTipoSangre() {
        return tipoSangre;
    }

    public void setTipoSangre(String tipoSangre) {
        this.tipoSangre = tipoSangre;
    }

    public void setEdad(Integer edad) {
		this.edad = edad;
	}

	@XmlTransient
    public List<Direccion> getDireccionList() {
        return direccionList;
    }

    public void setDireccionList(List<Direccion> direccionList) {
        this.direccionList = direccionList;
    }

    @XmlTransient
    public List<DatoFamiliar> getDatoFamiliarList() {
        return datoFamiliarList;
    }

    public void setDatoFamiliarList(List<DatoFamiliar> datoFamiliarList) {
        this.datoFamiliarList = datoFamiliarList;
    }

    @XmlTransient
    public List<Usuario> getUsuarioList() {
        return usuarioList;
    }

    public void setUsuarioList(List<Usuario> usuarioList) {
        this.usuarioList = usuarioList;
    }

    @XmlTransient
    public List<EstudioBasico> getEstudioBasicoList() {
        return estudioBasicoList;
    }

    public void setEstudioBasicoList(List<EstudioBasico> estudioBasicoList) {
        this.estudioBasicoList = estudioBasicoList;
    }

    @XmlTransient
    public List<Personal> getPersonalList() {
        return personalList;
    }

    public void setPersonalList(List<Personal> personalList) {
        this.personalList = personalList;
    }

    @XmlTransient
    public List<FormacionLaboral> getFormacionLaboralList() {
        return formacionLaboralList;
    }

    public void setFormacionLaboralList(List<FormacionLaboral> formacionLaboralList) {
        this.formacionLaboralList = formacionLaboralList;
    }

    @XmlTransient
    public List<Referencia> getReferenciaList() {
        return referenciaList;
    }

    public void setReferenciaList(List<Referencia> referenciaList) {
        this.referenciaList = referenciaList;
    }

    @XmlTransient
    public List<EstudioProfesional> getEstudioProfesionalList() {
        return estudioProfesionalList;
    }

    public void setEstudioProfesionalList(List<EstudioProfesional> estudioProfesionalList) {
        this.estudioProfesionalList = estudioProfesionalList;
    }

    @XmlTransient
    public List<Docencia> getDocenciaList() {
        return docenciaList;
    }

    public void setDocenciaList(List<Docencia> docenciaList) {
        this.docenciaList = docenciaList;
    }

    @XmlTransient
    public List<Postulante> getPostulanteList() {
        return postulanteList;
    }

    public void setPostulanteList(List<Postulante> postulanteList) {
        this.postulanteList = postulanteList;
    }

    public Ambito getLugarNacimiento() {
        return lugarNacimiento;
    }

    public void setLugarNacimiento(Ambito lugarNacimiento) {
        this.lugarNacimiento = lugarNacimiento;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPersona != null ? idPersona.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Persona)) {
            return false;
        }
        Persona other = (Persona) object;
        if ((this.idPersona == null && other.idPersona != null) || (this.idPersona != null && !this.idPersona.equals(other.idPersona))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "gob.cgr.sgrh.ejb.entidad.Persona[ idPersona=" + idPersona + " ]";
    }
    
    public String getNombreCompleto() {
    	System.out.println("apaterno es null?"+apellidoPaterno==null);
    	if(apellidoPaterno==null)
    		return "";
		return apellidoPaterno +" "+apellidoMaterno +" "+nombres;
	}

	private void setNombreCompleto(String nombreCompleto) {
		this.nombreCompleto = nombreCompleto;
	}
    
	public Integer getEdad(){
		Integer edadTemp=null;
		if(fechaNacimiento!=null){
			long nac=fechaNacimiento.getTime();
			long hoy=System.currentTimeMillis();
			long aniosTime=(365L*24L*3600000L);
				
			long edad=(hoy-nac)/aniosTime;
		
			return Long.valueOf(edad).intValue();
		}
		return edadTemp;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public boolean isPersonal() {
		return personal;
	}

	public void setPersonal(boolean personal) {
		this.personal = personal;
	}
}
